package com.margo.project;



import java.util.ArrayList;
import java.util.List;

import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;





/**
 * https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
 * @author fangxingbang
 * 
 * https://github.com/alibaba/dubbo-spring-boot-starter/
 * https://github.com/apache/dubbo-spring-boot-project
 *
 */
@SpringBootApplication
@EnableDubboConfig
public class SpringSentinelProvideApplication {
	public static void main(String[] args) {
		initFlowRules();
		SpringApplication.run(SpringSentinelProvideApplication.class, args);
	}
	
	/**
	 * Service Provider 用于向外界提供服务，处理各个消费者的调用请求。
	 * 	为了保护 Provider 不被激增的流量拖垮影响稳定性，可以给 Provider 配置 QPS 模式的限流，这样当每秒的请求量超过设定的阈值时会自动拒绝多的请求。
	 * 	限流粒度可以是服务接口和服务方法两种粒度。
	 * 		若希望整个服务接口的 QPS 不超过一定数值，则可以为对应服务接口资源（resourceName 为接口全限定名）配置 QPS 阈值；
	 * 		若希望服务的某个方法的 QPS 不超过一定数值，则可以为对应服务方法资源（resourceName 为接口全限定名:方法签名）配置 QPS 阈值
	 */
	private static void initFlowRules(){
	    List<FlowRule> rules = new ArrayList<>();
	    FlowRule rule = new FlowRule();
	    rule.setResource("com.margo.project.base.service.ExternalUserService:getFlowExternalUser(java.lang.String)");
	    //rule.setResource("com.margo.project.base.service.ExternalUserService");
	    rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
	    // Set limit QPS to 20.
	    rule.setCount(2);
	    rules.add(rule);
	    FlowRuleManager.loadRules(rules);
	}
}
